package com.mi.utils;

import java.text.DateFormat;
import java.text.DateFormatSymbols;
import java.text.SimpleDateFormat;
import java.util.Locale;

import org.apache.commons.beanutils.Converter;

// 转换器直接继承Converter接口就可以
public class DateTimeConverter implements Converter {
	
	// 要转换的目标日期类型的字符串格式
	private static final String DATE = "yyyy-MM-dd";
	private static final String DATETIME = "yyyy-MM-dd HH:mm";
	private static final String DATETIME1 = "yyyy-MM-dd HH:mm:ss";
	private static final String TIMESTAMP = "yyyy-MM-dd HH:mm:ss.SSS";

	/* (non-Javadoc)
	 * @将String类型转换为Date类型
	 * @第一个参数是要转换的目标类型【来自于实体类】
	 * @第二个参数值被转换的类型【来自于表单】
	 * @讲第二个参数转换为目标类型
	 */
	@Override
	public <T> T convert(Class<T> desDate, Object srcObj) {
		
		return toDate(desDate, srcObj);
	}

	/**
	 * 目的是将String类型的日期转换成Date类型的日期
	 * @param type
	 * @param value  要转换的内容
	 * @return
	 */
	public static <T> T toDate(Class<T> type, Object value) {
		// 判断是否为空
		if (value == null || "".equals(value)) {
			return null;
		}
		
		// 判断要转换的值是否是String类型
		if (value instanceof String) {
			// 获得转换的对象的字符串形式，剔除空格字符
			String dateValue = value.toString().trim();
			// 获取字符串长度
			int length = dateValue.length();
			// 判断被转换的类型是否为Date类型
			if (type.equals(java.util.Date.class)) {
				try {
					DateFormat formatter = null;

					// 转换为指定字符串格式的Date对象
					if (length <= 10) {
						formatter = new SimpleDateFormat(DATE, new DateFormatSymbols(Locale.CHINA));
					}else 
					// 转换为“yyyy-MM-dd HH:mm:ss”格式的Date对象
					if (length <= 16) {
						formatter = new SimpleDateFormat(DATETIME, new DateFormatSymbols(Locale.CHINA));
					}else
					// 转换为“yyyy-MM-dd HH:mm:ss”格式的Date对象
					if (length <= 19) {
						formatter = new SimpleDateFormat(DATETIME1, new DateFormatSymbols(Locale.CHINA));
					}else
					// 转换为“yyyy-MM-dd HH:mm:ss.SSS”格式的Date对象
					if (length <= 23) {
						formatter = new SimpleDateFormat(TIMESTAMP, new DateFormatSymbols(Locale.CHINA));
					}
					// parse()是SimpleDateFormat类的方法，解析字符串的文本，生成 Date
					return (T) formatter.parse(dateValue);
				} catch (Exception e) {
					// String类型的日期转换成Date类型的日期异常
					MyUtils.logRootLogger.info("String类型的日期转换成Date类型的日期异常"+e.getMessage());
					e.printStackTrace();
				}
			}
		}

		return (T) value;
	}
}
